import logging
import os


class CustomLogger:
    def __init__(self, log_file='../log/app.log', log_level=logging.INFO, console=True, log_dir='logs'):
        """
        初始化 CustomLogger 类。
        :param log_file: 日志文件的名称，默认为 'app.log'。
        :param log_level: 日志级别，默认为 logging.INFO。
        :param console: 是否在控制台打印日志，默认为 True。
        :param log_dir: 日志目录，默认为 'logs'。
        """
        self.log_file = os.path.join(log_dir, log_file)
        self.log_level = log_level
        self.console = console
        self.logger = self._setup_logger()

    def _setup_logger(self):
        """
        设置日志记录器。
        :return: 配置好的日志记录器对象。
        """
        # 创建日志目录（如果不存在）
        os.makedirs(os.path.dirname(self.log_file), exist_ok=True)

        # 创建日志记录器
        logger = logging.getLogger(self.log_file)
        logger.setLevel(self.log_level)

        # 检查是否已经添加过处理器，如果已添加则不再添加，避免重复输出
        if not logger.handlers:
            # 创建文件处理器
            file_handler = logging.FileHandler(self.log_file,encoding='utf-8')
            file_handler.setLevel(self.log_level)

            # 创建日志格式
            formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
            file_handler.setFormatter(formatter)
            logger.addHandler(file_handler)

            # 创建控制台处理器
            if self.console:
                console_handler = logging.StreamHandler()
                console_handler.setLevel(self.log_level)
                console_handler.setFormatter(formatter)
                logger.addHandler(console_handler)

        return logger

    def debug(self, message):
        """
        记录 DEBUG 级别的日志。
        :param message: 日志消息。
        """
        self.logger.debug(message)

    def info(self, message):
        """
        记录 INFO 级别的日志。
        :param message: 日志消息。
        """
        self.logger.info(message)

    def warning(self, message):
        """
        记录 WARNING 级别的日志。
        :param message: 日志消息。
        """
        self.logger.warning(message)

    def error(self, message):
        """
        记录 ERROR 级别的日志。
        :param message: 日志消息。
        """
        self.logger.error(message)

    def critical(self, message):
        """
        记录 CRITICAL 级别的日志。
        :param message: 日志消息。
        """
        self.logger.critical(message)


if __name__ == "__main__":
    # 使用示例
    logger = CustomLogger(log_file='../log/app.log', log_level=logging.DEBUG)
    logger.debug("This is a debug message")
    logger.info("This is an info message")
    logger.warning("This is a warning message")
    logger.error("This is an error message")
    logger.critical("This is a critical message")